#生产者消费者模拟
import threading
import random
import time
gMoney=1000
gConditon=threading.Condition()
gTotalTimes=10
gTimes=0

class Producer(threading.Thread):
    def run(self):
        global gMoney
        global gTimes
        while True:
            money=random.randint(100,1000)
            gConditon.acquire()
            #在进行生产之前，先判断是否10次
            if gTimes>=10:
                gConditon.release()
                break
            gMoney += money
            print("%s生产了%d元，剩余%d元"%(threading.current_thread(),money,gMoney))
            gTimes+=1
            gConditon.notify_all()
            gConditon.release()
            time.sleep(0.5)

#在此处需要设置退出条件，否则就是死循环。
#现在设置退出条件是10次,那么退出之前要解锁，不然别的线程无法访问了。
class Consumer(threading.Thread):
    def run(self):
        global gMoney
        global gTimes
        while True:
            money=random.randint(100,1000)
            gConditon.acquire()
            while True:
                if gTimes >= gTotalTimes:
                    gConditon.release()
                    return
                #这里使用return而不是break，是为了退出线程。不满足if的话，直接执行下面的。
                print("%s准备消费%d元，剩余%d元,不足" % (threading.current_thread(), money, gMoney))
                gConditon.wait()
            #但是在此处直接做减法，可能会出问题，就是，可能等这个线程拿到锁的时候，其他线程已经把钱消费得不够用了
            #可能消耗满10次了
                gMoney -= money
                print("%s消费了%d元，剩余%d元"%(threading.current_thread(),money,gMoney))
                gConditon.release()
                time.sleep(0.5)
def main():
     for x in range(5):
         t=Producer(name="生产者线程%d"%x)
         t.start()
     for x in range(3):
         t=Consumer(name="消费者线程%d"%x)
         t.start()
if __name__ == '__main__':
    main()